﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace Singleton
{
    /*
     * 多例模式的实现，需要借助字典进行单例对象的缓存
     * 普通的单例：进程内唯一；
     * 线程间单例：使用线程Id做标识符来存储多个单例对象；
     * 分布式单例：使用外部存储来存储公共的单例对象，每个对象访问时，都单例对象加锁-读取-释放-写回。
     */
    internal class MultiSingleton
    {
        public int id;
        private MultiSingleton(int id) { this.id = id; }
        MultiSingleton[] multiSingletons;

        private static class SingletonHolder
        {
            public static MultiSingleton[] instance;
        }
        public static MultiSingleton GetInstance(int index)
        {
            if (index > SingletonHolder.instance.Length)
            {
                if (SingletonHolder.instance[0]==null)
                {
                    SingletonHolder.instance[0] = new MultiSingleton(index);
                }
                //GetAddress(SingletonHolder.instance[0]);
                return SingletonHolder.instance[0];
            }
            else
            {
                if (SingletonHolder.instance[index] == null)
                {
                    SingletonHolder.instance[index] = new MultiSingleton(index);
                }
                //GetAddress(SingletonHolder.instance[index]);
                return SingletonHolder.instance[index];
            }
        }

        public static void Init(int count)
        {
            SingletonHolder.instance = new MultiSingleton[count];
        }

        
    }
}
